home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / lister.bas < prev    next >
BASIC Source File  |  1988-11-09  |  18KB  |  297 lines

  1. 100     '                       LISTER
  2. 110     DEF FNC$(WIDE%,PHRASE$)=SPACE$((WIDE%/2)-(LEN(PHRASE$)/2))+PHRASE$              'center PHRASE$ on a WIDE% character line
  3. 120     DEF FNUPSHIFT$(LOWSTR$)=CHR$(ASC(LOWSTR$) AND 95)                               'convert first character in LOWSTR$ to uppercase
  4. 130     DEF FNKNOWN$(BYTE%)="? "+RIGHT$("00"+HEX$(BYTE%),2)+" ?"                        'a byte whose purpose is unknown
  5. 200     '       Dimension arrays
  6. 210     DIM C$(128)                             'file buffer
  7. 400     DIM NONE$(124)
  8. 401     DATA    "INIT NONE"
  9. 402     DATA    "? 80 ?",       END,            FOR,            NEXT
  10. 403     DATA    DATA,           INPUT,          DIM,            READ
  11. 404     DATA    LET,            GOTO,           RUN,            IF
  12. 405     DATA    RESTORE,        GOSUB,          RETURN,         REM
  13. 406     DATA    STOP,           PRINT,          CLEAR,          LIST
  14. 407     DATA    NEW,            ON,             WAIT,           DEF
  15. 408     DATA    POKE,           CONT,           "? 9A ?",       "? 9B ?"
  16. 409     DATA    OUT,            LPRINT,         LLIST,          "? 9F ?"
  17. 410     DATA    WIDTH,          "? A1 ?",       TRON,           TROFF
  18. 411     DATA    SWAP,           ERASE,          EDIT,           ERROR
  19. 412     DATA    RESUME,         DELETE,         AUTO,           RENUM
  20. 413     DATA    DEFSTR,         DEFINT,         DEFSNG,         DEFDBL
  21. 414     DATA    LINE,           WHILE,          WEND,           CALL
  22. 415     DATA    "? B4 ?",       "? B5 ?",       "? B6 ",        WRITE
  23. 416     DATA    OPTION,         RANDOMIZE,      OPEN,           CLOSE
  24. 417     DATA    LOAD,           MERGE,          SAVE,           COLOR
  25. 418     DATA    CLS,            MOTOR,          BSAVE,          BLOAD
  26. 419     DATA    SOUND,          BEEP,           PSET,           PRESET
  27. 420     DATA    SCREEN,         KEY,            LOCATE,         "? CB ?"
  28. 421     DATA    TO,             THEN,           "TAB(",         STEP
  29. 422     DATA    USR,            FN,             "SPC(",         NOT
  30. 423     DATA    ERL,            ERR,            STRING$,        USING
  31. 424     DATA    INSTR,          "? D9 ?",       VARPTR,         CSRLIN
  32. 425     DATA    POINT,          OFF,            INKEY$,         "? DF ?"
  33. 426     DATA    "? E0 ?",       "? E1 ?",       "? E2 ?",       "? E3 ?"
  34. 427     DATA    "? E4 ?",       "? E5 ?",       ">",            "="
  35. 428     DATA    "<",            "+",            "-",            "*"
  36. 429     DATA    "/",            "^",            AND,            OR
  37. 430     DATA    XOR,            EQV,            IMP,            MOD
  38. 431     DATA    "? F4 ?",       "? F5 ?",       "? F6 ?",       "? F7 ?"
  39. 432     DATA    "? F8 ?",       "? F9 ?",       "? FA ?",       "? FB ?"
  40. 449     DATA    "END NONE"
  41. 450     DIM FD$(7)
  42. 451     DATA    "INIT FD"
  43. 452     DATA    "? FD 80 ?",    CVI,            CVS,            CVD
  44. 453     DATA    MKI$,           MKS$,           MKD$,           "? FD 87 ?"
  45. 454     DATA    "END FD"
  46. 500     DIM FE$(31)
  47. 501     DATA    "INIT FE"
  48. 502     DATA    "? FE 80 ?",    FILES,          FIELD,          SYSTEM
  49. 503     DATA    NAME,           LSET,           RSET,           KILL
  50. 504     DATA    PUT,            GET,            RESET,          COMMON
  51. 505     DATA    CHAIN,          DATE$,          TIME$,          PAINT
  52. 506     DATA    COM,            CIRCLE,         DRAW,           PLAY
  53. 507     DATA    TIMER,          ERDEV,          IOCTL,          CHDIR
  54. 508     DATA    MKDIR,          RMDIR,          SHELL,          ENVIRON
  55. 509     DATA    VIEW,           WINDOW,         PMAP,           "? FE 9F ?"
  56. 510     DATA    "END FE"
  57. 550     DIM FF$(39)
  58. 551     DATA    "INIT FF"
  59. 552     DATA    "? FF 80 ?",    LEFT$,          RIGHT$,         MID$
  60. 553     DATA    SGN,            INT,            ABS,            SQR
  61. 554     DATA    RND,            SIN,            LOG,            EXP
  62. 555     DATA    COS,            TAN,            ATN,            FRE
  63. 556     DATA    INP,            POS,            LEN,            STR$
  64. 557     DATA    VAL,            ASC,            CHR$,           PEEK
  65. 558     DATA    SPACE$,         OCT$,           HEX$,           LPOS
  66. 559     DATA    CINT,           CSNG,           CDBL,           FIX
  67. 560     DATA    PEN,            STICK,          STRIG,          EOF
  68. 561     DATA    LOC,            LOF,            "? FF A6 ?",    "? FF A7 ?"
  69. 562     DATA    "END FF"
  70. 700     FALSE%=0:TRUE%=NOT FALSE%               'initialize booleans
  71. 730     POINTER%=129
  72. 740     LINE.TOTAL%=0:CHECK%=TRUE%              'keep track of the lines
  73. 750     INSTEP%=3:INDENT%=7                     'keep track of indents
  74. 780     NO$=CHR$(0)                             'null character
  75. 790     BLANKLINE$=SPACE$(77)                   'used to blank out the screen
  76. 900     ON ERROR GOTO 30000
  77. 1000    '       Get Program Name
  78. 1010    CLS:LOCATE 5,1:PRINT FNC$(40,"Basic Program Lister");
  79. 1100    LOCATE 8,1:PRINT "Enter file name:                  "
  80. 1120    LOCATE 8,18:LINE INPUT LOWCASE$:PRINT BLANKLINE$;
  81. 1140    GOSUB 15000:IF UPCASE$="" THEN 9999
  82. 1150    FILENAME$=UPCASE$
  83. 1160    IF INSTR(FILENAME$,".")=0 THEN FILENAME$=FILENAME$+".BAS"
  84. 1200    '       Set up the input file
  85. 1210    OPEN "I",1,FILENAME$:CLOSE 1            'make sure the file exists
  86. 1220    OPEN "R",1,FILENAME$,128
  87. 1230    '       Field the file buffer
  88. 1240    FOR I%=1 TO 128                         'set up file buffer as an array
  89. 1250       FIELD #1,(I%-1) AS X$,1 AS C$(I%)    ' of 128 single characters
  90. 1260    NEXT I%
  91. 1300    LOCATE 10,1:LINE INPUT "Print to printer or file <Printer>: ";ANSWER$
  92. 1310    IF ANSWER$="" THEN ANSWER$="P" ELSE ANSWER$=FNUPSHIFT$(ANSWER$)
  93. 1320    IF ANSWER$="S" THEN DEVICE$="SCRN:":LONGNESS%=32767:GOTO 1390
  94. 1330    IF ANSWER$="P" THEN DEVICE$="LPT1:":LONGNESS%=62:GOTO 1390
  95. 1340    IF ANSWER$<>"F" THEN LOCATE 11,1:PRINT "Printer or File, only!":GOTO 1300
  96. 1350    DEVICE$=LEFT$(FILENAME$,INSTR(FILENAME$,"."))+"LST"
  97. 1360    LONGNESS%=64
  98. 1390    OPEN "O",2,DEVICE$
  99. 1400    LOCATE 12,1
  100. 1410    IF DEVICE$="SCRN:" THEN ANSWER$="" ELSE LINE INPUT "Regular or wide listing <Regular>: ";ANSWER$
  101. 1420    IF ANSWER$="" THEN ANSWER$="R" ELSE ANSWER$=FNUPSHIFT$(ANSWER$)
  102. 1430    IF ANSWER$="R" THEN WIDENESS%=80 ELSE IF ANSWER$="W" THEN WIDENESS%=132 ELSE PRINT "Please answer 'Regular' or 'Wide', only!":GOTO 1400
  103. 1440    IF ANSWER$="W" THEN WIDENESS%=132
  104. 1490    IF DEVICE$="LPT1:" THEN WIDTH #2,WIDENESS%
  105. 1500    NONE%=0:RESTORE:READ LISTDATA$
  106. 1510    WHILE (LISTDATA$<>"INIT NONE"):READ LISTDATA$:WEND:READ LISTDATA$
  107. 1520    WHILE (LISTDATA$<>"END NONE")
  108. 1530     NONE$(NONE%)=LISTDATA$:NONE%=NONE%+1
  109. 1540     READ LISTDATA$
  110. 1550    WEND:NONE%=NONE%-1
  111. 1600    FD%=0:RESTORE:READ LISTDATA$
  112. 1610    WHILE (LISTDATA$<>"INIT FD"):READ LISTDATA$:WEND:READ LISTDATA$
  113. 1620    WHILE (LISTDATA$<>"END FD")
  114. 1630     FD$(FD%)=LISTDATA$:FD%=FD%+1
  115. 1640     READ LISTDATA$
  116. 1650    WEND:FD%=FD%-1
  117. 1700    FE%=0:RESTORE:READ LISTDATA$
  118. 1710    WHILE (LISTDATA$<>"INIT FE"):READ LISTDATA$:WEND:READ LISTDATA$
  119. 1720    WHILE (LISTDATA$<>"END FE")
  120. 1730     FE$(FE%)=LISTDATA$:FE%=FE%+1
  121. 1740     READ LISTDATA$
  122. 1750    WEND:FE%=FE%-1
  123. 1800    FF%=0:RESTORE:READ LISTDATA$
  124. 1810    WHILE (LISTDATA$<>"INIT FF"):READ LISTDATA$:WEND:READ LISTDATA$
  125. 1820    WHILE (LISTDATA$<>"END FF")
  126. 1830     FF$(FF%)=LISTDATA$:FF%=FF%+1
  127. 1840     READ LISTDATA$
  128. 1850    WEND:FF%=FF%-1
  129. 1900    '       Set up heading
  130. 1910    HEADING$=FNC$(WIDENESS%,"Listing for "+FILENAME$)
  131. 1990    GOSUB 17000                             'print first header
  132. 3000    '       Read First Three Characters of Basic Program File
  133. 3010    GOSUB 14000
  134. 3020    IF C%<>255 THEN PRINT "Not a tokenized program file!":GOTO 9999
  135. 3030    GOSUB 11000                             'get first offset address
  136. 3100    '       Get all Variable Name and Line Number References
  137. 3120    WHILE ADR<>0                            'ADR=0 if end of program
  138. 3140       GOSUB 14000:LINE.NO=C%
  139. 3150       GOSUB 14000:LINE.NO=(CSNG(C%)*256)+LINE.NO
  140. 3160       OUTLINE$="":TEMP$=STR$(LINE.NO):GOSUB 18500
  141. 3170       OUTLINE$=LEFT$(OUTLINE$+SPACE$(INDENT%),INDENT%)                                'position line num and margin
  142. 3180       GOSUB 14000                          'get ready for the line
  143. 3190       WHILE C%=32:GOSUB 14000:WEND
  144. 3200       IFDENT%=0:IFFLAG%=0                  'IF indenters
  145. 3210       IFED%=0:THENED%=0                    'IF/THEN counters
  146. 3390       FIRST%=TRUE%                         'haven't gotten anything yet
  147. 3400       WHILE C%<>0                          'C%=0 if end of line
  148. 3410          T1%=C%                            'save first token
  149. 3500          IF C%<255 THEN 3600               'not in FF array
  150. 3510          GOSUB 14000:TOKEN%=C%-128         'get index into array
  151. 3520          IF TOKEN%<0 OR TOKEN%>FF% THEN TOKEN$=FNKNOWN$(TOKEN%+128) ELSE TOKEN$=FF$(TOKEN%)                                'get token to print
  152. 3590          GOTO 4000                         'handle special tokens
  153. 3600          IF C%<254 THEN 3700               'not in FE array
  154. 3610          GOSUB 14000:TOKEN%=C%-128         'get index into array
  155. 3620          IF TOKEN%<0 OR TOKEN%>FE% THEN TOKEN$=FNKNOWN$(TOKEN%+128) ELSE TOKEN$=FE$(TOKEN%)                                'get token to print
  156. 3690          GOTO 4000                         'handle special tokens
  157. 3700          IF C%<253 THEN 3800               'not in FD array
  158. 3710          GOSUB 14000:TOKEN%=C%-128         'get index into array
  159. 3720          IF TOKEN%<0 OR TOKEN%>FD% THEN TOKEN$=FNKNOWN$(TOKEN%+128) ELSE TOKEN$=FD$(TOKEN%)                                'get token to print
  160. 3790          GOTO 4000                         'handle special tokens
  161. 3800          IF C%<128 THEN 4500               'not in NONE array
  162. 3810          TOKEN%=C%-128                     'get index into array
  163. 3820          IF TOKEN%<0 OR TOKEN%>NONE% THEN TOKEN$=FNKNOWN$(TOKEN%+128) ELSE TOKEN$=NONE$(TOKEN%)                            'get token to print
  164. 3890          GOTO 4000                         'handle special tokens
  165. 4000          'Got the token, now process it
  166. 4001    'PRINT "*****4001   Token '"TOKEN$"' has value "T1%;:IF T1%=C% THEN PRINT ELSE PRINT " "C%
  167. 4010          IF (T1%=205) OR (T1%=137 AND IFED%-THENED%>0) THEN GOSUB 19000:OUTLINE$=SPACE$(INDENT%+IFDENT%)+TOKEN$:IFDENT%=IFDENT%+5:IFFLAG%=IFFLAG% OR 2^THENED%:THENED%=THENED%+1:GOTO 4890                 'THEN or GOTO used as THEN
  168. 4030          IF T1%=131 OR T1%=178 THEN INDENT%=INDENT%-3:OUTLINE$=LEFT$(OUTLINE$,LEN(OUTLINE$)-3)                                                                           'unindent after NEXT or WEND statements
  169. 4100          OUTLINE$=OUTLINE$+TOKEN$          'output the token
  170. 4110          IF T1%<>C% THEN 4890
  171. 4120          IF C%=132 THEN WHILE (C%<>0 AND C%<>58):GOSUB 14000:OUTLINE$=OUTLINE$+CHR$(C%):WEND:GOTO 4900                     'DATA statement
  172. 4130          IF C%=130 OR C%=177 THEN INDENT%=INDENT%+3:IF C%<>177 THEN 4890 ELSE GOSUB 14000:GOTO 4890                                                                      'indent after FOR or WHILE statements
  173. 4140          IF C%=139 THEN IFDENT%=IFDENT%+3:IFED%=IFED%+1:GOTO 4890                        'increment IF indent
  174. 4490          GOTO 4890
  175. 4500          IF (C%>10 AND C%<14) OR C%=28 THEN CNT%=2:GOSUB 18000:TEMP$=STR$(CVI(TEMP$)):GOSUB 18500:GOTO 4890                'two-byte constant
  176. 4510          IF C%=14 THEN GOSUB 13000:GOTO 4900'line number
  177. 4520          IF C%=15 THEN GOSUB 14000:TEMP$=STR$(C%):GOSUB 18500:GOTO 4890
  178. 4530          IF (C%>16 AND C%<27) THEN TEMP$=STR$(C%-17):GOSUB 18500:GOTO 4890
  179. 4540          IF C%=29 THEN CNT%=4:GOSUB 18000:TEMP$=STR$(CVS(TEMP$)):GOSUB 18500:GOTO 4890                                     'four-byte constant
  180. 4550          IF C%=31 THEN CNT%=8:GOSUB 18000:TEMP$=STR$(CVD(TEMP$)):GOSUB 18500:GOTO 4890                                     'eight-byte constant
  181. 4560          IF C%=32 THEN BLANKS%=0:WHILE C%=32:BLANKS%=BLANKS%+1:GOSUB 14000:WEND:IF C%<>58 THEN OUTLINE$=OUTLINE$+SPACE$(BLANKS%):GOTO 4900 ELSE GOSUB 10000:GOTO 4900                                      'blanks
  182. 4570          IF C%=34 THEN OUTLINE$=OUTLINE$+CHR$(C%):GOSUB 14000:WHILE (C%<>34 AND C%<>0):OUTLINE$=OUTLINE$+CHR$(C%):GOSUB 14000:WEND:IF C%=0 THEN 4900 ELSE OUTLINE$=OUTLINE$+CHR$(C%):GOTO 4890             'print string constant
  183. 4580          IF C%=58 THEN GOSUB 10000:GOTO 4900
  184. 4590          IF (C%>64 AND C%<91) THEN GOSUB 12000:GOTO 4900
  185. 4790          OUTLINE$=OUTLINE$+CHR$(C%):GOTO 4890
  186. 4800          OUTLINE$=OUTLINE$+"?"+FNKNOWN$(C%)+"?"
  187. 4890          GOSUB 14000
  188. 4900          FIRST%=FALSE%
  189. 4910       WEND
  190. 4920       GOSUB 19000                          'dump out last line
  191. 4980       GOSUB 11000                          'begin new line
  192. 4990    WEND:PRINT #2,
  193. 9800    IF DEVICE$<>"SCRN:" THEN FOR I%=LINES% TO 4 STEP -1:PRINT #2,:NEXT I%
  194. 9810    PRINT #2,NO$+SPACE$(WIDENESS%-10)"Page "PAGES%
  195. 9820    IF DEVICE$="SCRN:" THEN PRINT #2, ELSE PRINT #2,CHR$(12)
  196. 9999    IF DEVICE$="SCRN:" THEN 32767 ELSE LOCATE 22,1:PRINT "All done!":GOTO 32767
  197. 10000   '       Special cases of ":"
  198. 10010   GOSUB 14000
  199. 10020   IF C%<>161 THEN 10050 ELSE GOSUB 19000:C%=7
  200. 10030   C%=C%-1:IF C%<0 THEN STOP ELSE IF (IFFLAG% AND 2^C%)=0 THEN 10030 ELSE IFFLAG%=IFFLAG% XOR (2^C%):C%=C%+1:IF C%<>THENED% THEN IFDENT%=C%*8:THENED%=C%:IFED%=C%  'Whew! this should take care of any IF/THEN/ELSE in existence
  201. 10040   OUTLINE$=SPACE$(INDENT%+IFDENT%-5)+"ELSE":GOSUB 14000:RETURN
  202. 10050   IF C%<>143 THEN GOSUB 19000:OUTLINE$="     : "+SPACE$(INDENT%+IFDENT%-7):RETURN                                         '":" token
  203. 10060   GOSUB 14000
  204. 10070   IF C%<>217 THEN RETURN
  205. 10080   IF NOT FIRST% THEN GOSUB 19000:OUTLINE$=SPACE$(INDENT%)
  206. 10090   OUTLINE$=OUTLINE$+"'":GOSUB 14000:RETURN
  207. 11000   '       Get BASIC offset address for a line
  208. 11010   GOSUB 14000:ADR=C%
  209. 11020   GOSUB 14000:ADR=(CSNG(C%)*256)+ADR
  210. 11090   RETURN
  211. 12000   '       Get a variable name
  212. 12020   LABEL$=CHR$(C%)
  213. 12110   GOSUB 14000
  214. 12200   WHILE (C%>47 AND C%<58) OR (C%>64 AND C%<91) OR C%=46
  215. 12210      LABEL$=LABEL$+CHR$(C%)
  216. 12220      GOSUB 14000
  217. 12230   WEND
  218. 12240   IF (C%>34 AND C%<38) OR C%=33 THEN LABEL$=LABEL$+CHR$(C%):GOSUB 14000
  219. 12380   OUTLINE$=OUTLINE$+LABEL$
  220. 12390   RETURN
  221. 13000   '       Get a line number
  222. 13110   GOSUB 14000:TEMP=C%
  223. 13120   GOSUB 14000:TEMP=(CSNG(C%)*256)+TEMP
  224. 13130   TEMP$=STR$(TEMP):GOSUB 18500
  225. 13200   GOSUB 14000
  226. 13290   RETURN
  227. 14000   '       Get ASCII value of next byte
  228. 14010   IF POINTER%>127 THEN GET #1:POINTER%=0  'get next block of bytes
  229. 14040   POINTER%=POINTER%+1
  230. 14050   C%=ASC(C$(POINTER%))                    'get next byte
  231. 14090   RETURN
  232. 15000   '       Convert LOWCASE$ to UPCASE$
  233. 15010   UPCASE$=""
  234. 15020   IF LEN(LOWCASE$)=0 THEN RETURN
  235. 15030   TEMPVAL%=ASC(LOWCASE$) AND 127          'get ASCII value of character
  236. 15040   IF TEMPVAL%>96 AND TEMPVAL%<123 THEN TEMPVAL%=(TEMPVAL% AND 95)
  237. 15050   IF TEMPVAL%<>32 THEN UPCASE$=UPCASE$+CHR$(TEMPVAL%)
  238. 15060   LOWCASE$=RIGHT$(LOWCASE$,LEN(LOWCASE$)-1)
  239. 15090   GOTO 15020
  240. 16000   '       Print end of page stuff
  241. 16010   IF PAGES%=0 THEN 17000
  242. 16020   PRINT #2,
  243. 16030   PRINT #2,NO$+SPACE$(WIDENESS%-10)"Page "PAGES%
  244. 16090   IF DEVICE$="SCRN:" THEN PRINT #2, ELSE PRINT #2,CHR$(12)
  245. 17000   '       Print the header
  246. 17010   PRINT #2,:PRINT #2,
  247. 17020   PRINT #2,TIME$;TAB(WIDENESS%-12);DATE$
  248. 17030   PRINT #2,
  249. 17040   PRINT #2,HEADING$
  250. 17050   PRINT #2,:PRINT #2,
  251. 17080   PAGES%=PAGES%+1:LINES%=LONGNESS%-7
  252. 17090   RETURN
  253. 18000   '       Put a number CNT% bytes long into TEMP$
  254. 18010   TEMP$="":FOR TEMP%=1 TO CNT%
  255. 18020   GOSUB 14000:TEMP$=TEMP$+CHR$(C%)
  256. 18030   NEXT TEMP%
  257. 18090   RETURN
  258. 18500   '       Chop blank off front of TEMP$
  259. 18510   IF ASC(TEMP$)=32 THEN TEMP$=RIGHT$(TEMP$,LEN(TEMP$)-1)
  260. 18580   OUTLINE$=OUTLINE$+TEMP$
  261. 18590   RETURN
  262. 19000   '       Print OUTLINE$ to the device
  263. 19010   FIRST%=TRUE%
  264. 19020   IF NOT FIRST% THEN OUTLINE$=SPACE$(INDENT%+5)+OUTLINE$
  265. 19030   OUTLEN%=LEN(OUTLINE$):IF OUTLEN%<81 THEN PRINT #2,OUTLINE$:LINES%=LINES%-1 ELSE PRINT #2,LEFT$(OUTLINE$,79):OUTLINE$=RIGHT$(OUTLINE$,OUTLEN%-79):LINES%=LINES%-1:FIRST%=FALSE%:GOTO 19020               'print the line
  266. 19070   IF LINES%<6 THEN GOSUB 16000            'go to new page
  267. 19080   OUTLINE$=""                             'blank out the line
  268. 19090   RETURN
  269. 30000   '       E r r o r   T r a p s
  270. 31000   IF ERL=1210 THEN LOCATE 9,1:PRINT "That file doesn't exist!":RESUME 1100
  271. 32000   PRINT "Error #";:IF ERR=255 THEN PRINT TEMPERR%; ELSE PRINT ERR;
  272. 32010   PRINT " at "ERL
  273. 32100   IF ERR=255 THEN ERRMSG$="Programmer error":GOTO 32600
  274. 32110   IF ERR=68 THEN ERRMSG$="Device Unavailable":GOTO 32600
  275. 32120   IF ERR=69 THEN ERRMSG$="Communications Buffer Overflow":GOTO 32600
  276. 32130   IF ERR=70 THEN ERRMSG$="Disk Write Protected":GOTO 32600
  277. 32140   IF ERR=71 THEN ERRMSG$="Disk Not Ready":GOTO 32600
  278. 32150   IF ERR=72 THEN ERRMSG$="Disk Media Error":GOTO 32600
  279. 32160   IF ERR=73 THEN ERRMSG$="Advanced Feature":GOTO 32600
  280. 32190   IF (ERR>30 AND ERR<50) OR ERR>73 OR ERR<1 THEN ERRMSG$="Undefined error":GOTO 32600                                     'catch messageless errors
  281. 32200   RESTORE 32500
  282. 32210   FOR I%=1 TO ERR:READ MSGPTR:NEXT I%    'get address
  283. 32220   MSGPTR=MSGPTR+25000
  284. 32300   DEF SEG=&HF000
  285. 32310   ERRMSG$=""
  286. 32400   BYTE$=CHR$(PEEK(MSGPTR)):IF BYTE$<>CHR$(0) THEN ERRMSG$=ERRMSG$+BYTE$:MSGPTR=MSGPTR+1:GOTO 32400                        'get the message
  287. 32410   IF ERRMSG$="?" THEN ERRMSG$="(Undefined error)"
  288. 32490   GOTO 32600
  289. 32500   DATA 525,542,555,576,588,610,619,633,655,678,699,716,731,745,765,781,808,823,847,857,878,896,912,933,948,961,978,991,993,1012
  290. 32510   DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  291. 32520   DATA 1031,1046,1061,1077,1092,1106,1124,1126,1143,1163,1165,1167,1177,1192,1210,1224,1226,1251
  292. 32600   BEEP:PRINT:PRINT ERRMSG$:PRINT:PRINT "PLEASE WRITE THIS DOWN!!!":PRINT
  293. 32610   PRINT "To exit, hit a key"
  294. 32620   DEF SEG=0:POKE 1050,PEEK(1052)          'clear keyboard buffer
  295. 32650   IF INKEY$="" THEN 32650
  296. 32767   END
  297.